home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / FREQ.TST / CHISQFRQ.C < prev    next >
Text File  |  1996-03-26  |  2KB  |  80 lines

  1. /* ============ */
  2. /* ChiSqFrq.c    */
  3. /* ============ */
  4. /* -------------------------------- */
  5. /* WorkArea is defined in freqtst.c */
  6. /* -------------------------------- */
  7. #define    Freq    WorkArea
  8. /* ====================================================== */
  9. /* ChiSqFreq - Calculates Chi-Square Value of Frequencies */
  10. /* ====================================================== */
  11. void
  12. ChiSqFreq(CHISQ_STRU * ChiSqData)
  13. {
  14.     ULONG   i, MaxNums, MaxSize;
  15.  
  16.     double  SosFreq = 0;
  17.  
  18.     /* ------------------------------------------ */
  19.     /* RandFun is assumed to produce uniformly    */
  20.     /* distributed random numbers in [0,RAND_MAX] */
  21.     /* ------------------------------------------ */
  22.  
  23.     MaxSize = (ULONG)ChiSqData->NumElements;
  24.     MaxNums = ChiSqData->NumVariates;
  25.  
  26.     for (i = 0; i < MaxSize; ++i)
  27.     {
  28.     Freq[i] = 0;
  29.     }
  30.  
  31.     /* --------------------------------------- */
  32.     /* Collect Data for Chi-Square Calculation */
  33.     /* --------------------------------------- */
  34.     for (i = 0; i < MaxNums; ++i)
  35.     {
  36.     int    NewRand;
  37.  
  38.     NewRand = (int)(ChiSqData->RandFun() % (int)MaxSize);
  39.     ++Freq[NewRand];
  40.     }
  41.  
  42.     /* --------------------------- */
  43.     /* Counting Variates Generated */
  44.     /* --------------------------- */
  45.     ChiSqData->TotNumGen += MaxNums;
  46.  
  47.     /* ---------------------------------------- */
  48.     /* Calculate Sums of Squares of Frequencies */
  49.     /* ---------------------------------------- */
  50.     for (i = 0; i < MaxSize; ++i)
  51.     {
  52.         SosFreq += SQR((double) Freq[i]);
  53.     }
  54.  
  55.     /* -------------------------- */
  56.     /* Calculate Chi-Square Value */
  57.     /* -------------------------- */
  58.     ChiSqData->ChiSqValu = (SosFreq / (double) MaxNums) *
  59.     (double) MaxSize - (double) MaxNums;
  60.  
  61. # if defined(FIND_NULLS)
  62.     {
  63.     UINT    Largest = 1, Smallest = RAND_MAX;
  64.     UINT    ZeroCount = 0;
  65.  
  66.     for (i = 0; i < MaxSize; ++i)
  67.     {
  68.         Largest = __max(Largest, Freq[i]);
  69.         Smallest = __min(Smallest, Freq[i]);
  70.         if (Freq[i] == 0)
  71.         {
  72.             ++ZeroCount;
  73.         }
  74.     }
  75.     printf("ZeroCount = %u, Smallest Count = %u, Largest = %u\n",
  76.         ZeroCount, Smallest, Largest);
  77.     }
  78. # endif
  79. }
  80.